class StringUtils {
  /**
   * 判断字符串是否为空、null或undefined
   * @param {string} str - 字符串
   * @returns {boolean} 是否为空
   */
  static isEmpty(str: string): boolean {
    return !str || str.trim().length === 0
  }

  /**
   * 判断字符串不为空、null或undefined
   * @param {string} str - 字符串
   * @returns {boolean} 是否为空
   */
  static isNotEmpty(str: string): boolean {
    return !this.isEmpty(str)
  }

  /**
   * 判断两个字符串是否相等
   * @param {string} str1 - 第一个字符串
   * @param {string} str2 - 第二个字符串
   * @returns {boolean} 是否相等
   */
  static equals(str1: string, str2: string): boolean {
    return str1 === str2
  }

  /**
   * 忽略大小写判断两个字符串是否相等
   * @param {string} str1 - 第一个字符串
   * @param {string} str2 - 第二个字符串
   * @returns {boolean} 是否相等
   */
  static equalsIgnoreCase(str1: string, str2: string): boolean {
    return str1.toLowerCase() === str2.toLowerCase()
  }

  /**
   * 去掉字符串两端的空白字符
   * @param {string} str - 字符串
   * @returns {string} 去除空白字符后的字符串
   */
  static trim(str: string): string {
    return str.trim()
  }

  /**
   * 判断字符串是否以特定的前缀开头
   * @param {string} str - 字符串
   * @param {string} prefix - 前缀
   * @returns {boolean} 是否以特定前缀开头
   */
  static startsWith(str: string, prefix: string): boolean {
    return str.startsWith(prefix)
  }

  /**
   * 判断字符串是否以特定的后缀结尾
   * @param {string} str - 字符串
   * @param {string} suffix - 后缀
   * @returns {boolean} 是否以特定后缀结尾
   */
  static endsWith(str: string, suffix: string): boolean {
    return str.endsWith(suffix)
  }

  /**
   * 将字符串转为大写
   * @param {string} str - 字符串
   * @returns {string} 大写后的字符串
   */
  static toUpperCase(str: string): string {
    return str.toUpperCase()
  }

  /**
   * 将字符串转为小写
   * @param {string} str - 字符串
   * @returns {string} 小写后的字符串
   */
  static toLowerCase(str: string): string {
    return str.toLowerCase()
  }

  /**
   * 将字符串的首字母转为大写
   * @param {string} str - 字符串
   * @returns {string} 首字母大写后的字符串
   */
  static capitalize(str: string): string {
    if (this.isEmpty(str)) return str
    return str.charAt(0).toUpperCase() + str.slice(1)
  }

  /**
   * 将字符串的首字母转为小写
   * @param {string} str - 字符串
   * @returns {string} 首字母小写后的字符串
   */
  static uncapitalize(str: string): string {
    if (this.isEmpty(str)) return str
    return str.charAt(0).toLowerCase() + str.slice(1)
  }

  /**
   * 重复字符串n次
   * @param {string} str - 字符串
   * @param {number} times - 重复次数
   * @returns {string} 重复后的字符串
   */
  static repeat(str: string, times: number): string {
    return str.repeat(times)
  }

  /**
   * 字符串是否包含子字符串
   * @param {string} str - 字符串
   * @param {string} searchStr - 子字符串
   * @returns {boolean} 是否包含子字符串
   */
  static contains(str: string, searchStr: string): boolean {
    return str.includes(searchStr)
  }

  /**
   * 移除字符串中的所有空白字符
   * @param {string} str - 字符串
   * @returns {string} 移除空白后的字符串
   */
  static removeWhitespace(str: string): string {
    return str.replace(/\s+/g, '')
  }

  /**
   * 替换所有匹配的子字符串
   * @param {string} str - 字符串
   * @param {string} search - 要替换的子字符串
   * @param {string} replacement - 替换后的字符串
   * @returns {string} 替换后的字符串
   */
  static replaceAll(str: string, search: string, replacement: string): string {
    return str.split(search).join(replacement)
  }

  /**
   * 将字符串按分隔符拆分为数组
   * @param {string} str - 字符串
   * @param {string} separator - 分隔符
   * @returns {Array} 拆分后的数组
   */
  static split(str: string, separator: string): Array<string> {
    return str.split(separator)
  }

  /**
   * 将数组元素连接成字符串
   * @param {Array} arr - 数组
   * @param {string} separator - 分隔符
   * @returns {string} 连接后的字符串
   */
  static join(arr: Array<string>, separator: string): string {
    return arr.join(separator)
  }

  /**
   * 获取字符串的字节长度
   * @param {string} str - 字符串
   * @returns {number} 字节长度
   */
  static byteLength(str: string): number {
    return new Blob([str]).size
  }

  /**
   * 判断字符串是否是JSON格式
   * @param {string} str - 字符串
   * @returns {boolean} 是否是JSON格式
   */
  static isJson(str: string): boolean {
    try {
      JSON.parse(str)
      return true
    } catch (e) {
      return false
    }
  }

  /**
   * 将字符串转换为驼峰命名法
   * @param {string} str - 字符串
   * @returns {string} 驼峰命名法字符串
   */
  static toCamelCase(str: string): string {
    return str.replace(/[-_](.)/g, (_, group1) => group1.toUpperCase())
  }

  /**
   * 将字符串转换为蛇形命名法
   * @param {string} str - 字符串
   * @returns {string} 蛇形命名法字符串
   */
  static toSnakeCase(str: string): string {
    return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`)
  }

  /**
   * 将字符串反转
   * @param {string} str - 字符串
   * @returns {string} 反转后的字符串
   */
  static reverse(str: string): string {
    return str.split('').reverse().join('')
  }

  /**
   * 截取指定长度的字符串并添加省略号
   * @param {string} str - 字符串
   * @param {number} length - 截取长度
   * @param {string} [ellipsis='...'] - 替换后的符号 默认省略号
   * @returns {string} 截取后的字符串
   */
  static truncate(str: string, length: number, ellipsis: string = '...'): string {
    if (!str || str.length <= length) {
      return str || ''  // 如果 str 为 null 或 undefined，则返回空字符串
    }
    return str.slice(0, length) + ellipsis
  }

  /**
   * 判断字符串是否是一个有效的URL
   * @param {string} str - 字符串
   * @returns {boolean} 是否是有效的URL
   */
  static isValidURL(str: string): boolean {
    try {
      new URL(str)
      return true
    } catch (e) {
      return false
    }
  }
}

export default StringUtils
